package com.sen.common.utils;

import java.util.Collection;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;

/**
 * 断言工具类, 用于判断参数的有效性. 用于在运行时刻识别参数的错误.
 * 
 * @author sen
 */
public final class Asserts {
	
	private Asserts() {
		// empty!
	}
	
	/**
	 * 判断一个表达式是否为真, 若为假则抛出异常.
	 * 
	 * @param expression
	 *            布尔表达式
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if expression is <code>false</code>
	 */
	public static void assertTrue(boolean expression, String message) {
		if (!expression) {
			throw new IllegalArgumentException(message);
		}
	}

	/**
	 * 判断一个表达式是否为真, 若为假则抛出异常.
	 * 
	 * @param expression
	 *            布尔表达式
	 * @throws IllegalArgumentException
	 *             if expression is <code>false</code>
	 */
	public static void assertTrue(boolean expression) {
		assertTrue(expression, "[断言失败] - 表达式必须为真.");
	}

	/** 判断Long是否大于0 */
	public static void assertGtZero(Long expression, String message) {
		if (expression == null || expression <= 0) {
			throw new IllegalArgumentException(message);
		}
	}

	/** 判断Long是否大于0 */
	public static void assertGtZero(Long expression) {
		assertGtZero(expression, "[断言失败] - 表达式必须大于0.");
	}

	/**
	 * 判断一个对象是否为null, 若不为null则抛出异常.
	 * 
	 * @param obj
	 *            要断言的对象
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if obj is not <code>null</code>
	 */
	public static void assertNull(Object obj, String message) {
		if (obj != null) {
			throw new IllegalArgumentException(message);
		}
	}

	/**
	 * 判断一个对象是否不为null, 若为null则抛出异常.
	 * 
	 * @param obj
	 *            要断言的对象
	 * @throws IllegalArgumentException
	 *             if obj is not <code>null</code>
	 */
	public static void assertNull(Object obj) {
		assertNull(obj, "[断言失败] - 对象必须为null.");
	}

	/**
	 * 判断一个对象是否不为null, 若为null则抛出异常.
	 * 
	 * @param obj
	 *            要断言的对象
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if obj is <code>null</code>
	 */
	public static void assertNotNull(Object obj, String message) {
		if (obj == null) {
			throw new IllegalArgumentException(message);
		}
	}

	/**
	 * 判断一个对象是否不为null, 若为null则抛出异常.
	 * 
	 * @param obj
	 *            要断言的对象
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if obj is <code>null</code>
	 */
	public static void assertNotNull(Object obj) {
		assertNotNull(obj, "[断言失败] - 对象必须不为null.");
	}

	/**
	 * 判断字符串是否不为null或empty; 若为null或empty则抛出异常.
	 * 
	 * @param text
	 *            要判断的字符串
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if text is <code>null</code> or empty.
	 */
	public static void assertNotEmpty(String text, String message) {
		if (StringUtils.isEmpty(text)) {
			throw new IllegalArgumentException(message);
		}
	}

	/**
	 * 判断字符串是否不为null或empty; 若为null或empty则抛出异常.
	 * 
	 * @param text
	 *            要判断的字符串
	 * @throws IllegalArgumentException
	 *             if text is <code>null</code> or empty.
	 */
	public static void assertNotEmpty(String text) {
		assertNotEmpty(text, "[断言失败] - 字符串必须要有长度; 必须不为null或empty.");
	}

	/**
	 * 判断集合是否有值; 若集合为null或长度为0则抛出异常.
	 * 
	 * @param collection
	 *            要判断的集合
	 * @throws IllegalArgumentException
	 *             if collection is <code>null</code> or empty.
	 */
	public static void assertNotEmpty(Collection<?> collection) {
		assertNotEmpty(collection, "[断言失败] - 集合必须不为null或长度不为0.");
	}

	/**
	 * 判断集合是否有值; 若集合为null或长度为0则抛出异常.
	 * 
	 * @param collection
	 *            要判断的集合
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if collection is <code>null</code> or empty.
	 */
	public static void assertNotEmpty(Collection<?> collection, String message) {
		if (CollectionUtils.isEmpty(collection)) {
			throw new IllegalArgumentException(message);
		}
	}

	/**
	 * 判断map是否有值; 若map为null或长度为0则抛出异常.
	 * 
	 * @param collection
	 *            要判断的map
	 * @throws IllegalArgumentException
	 *             if collection is <code>null</code> or empty.
	 */
	public static void assertNotEmpty(Map<?, ?> map) {
		assertNotEmpty(map, "[断言失败] - Map必须不为null或长度不为0.");
	}

	/**
	 * 判断map是否有值; 若map为null或长度为0则抛出异常.
	 * 
	 * @param collection
	 *            要判断的map
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if collection is <code>null</code> or empty.
	 */
	public static void assertNotEmpty(Map<?, ?> map, String message) {
		if (MapUtils.isEmpty(map)) {
			throw new IllegalArgumentException(message);
		}
	}

	/**
	 * 判断array是否不为null; 若array为null则抛出异常.
	 * 
	 * @param array
	 *            要判断的array
	 * @throws IllegalArgumentException
	 *             if collection is <code>null</code> or empty.
	 */
	public static void assertNotNull(Object[] array) {
		assertNotNull(array, "[断言失败] - array必须不为null.");
	}

	/**
	 * 判断array是否不为null; 若array为null则抛出异常.
	 * 
	 * @param array
	 *            要判断的array
	 * @param message
	 *            出错提示信息
	 * @throws IllegalArgumentException
	 *             if collection is <code>null</code> or empty.
	 */
	public static void assertNotNull(Object[] array, String message) {
		if (null == array) {
			throw new IllegalArgumentException(message);
		}
	}
}
